#include<iostream>
#include<string>
#include<algorithm>
#include<functional>
#include<ctime>

using namespace std;

void hello1()
{
    cout << "hello,world!" << endl;
}
void hello2(string str)
{
    cout << str << endl;
}
int sum(int a,int b){
    return a + b;
}

class Test{
    public:
    void hello(string str){
        cout << str;
    }
};

int main(){

    /* 
    function函数的使用方法，function<typename(typename1,...)> xxx=yyy;
    typename表示函数的返回类型，typename_1表示寒暑的参数类型，xxx表示function重命名的函数，yyy表示原来的函数
    */
    //  调用函数hello1()，function使用的是函数类型
    function<void()> func1 = hello1;
    // 调用函数hello1()，function使用的是函数指针类型
    // function<void(*)> func1 = hello1;
    // 本质上和hello1()没有区别，调用了func1对象（）重载函数->hello1.operator()
    func1();

    function<void(string)> func2 = hello2;
    func2("hello2!");

    function<int(int, int)> func3 = sum;
    cout << func3(10, 20) << endl;

    function<int(int, int)> func4 = [](int a, int b)->int{ return a + b; };
    cout << func4(10, 20);

    function<void(Test*, string)> func5 = &Test::hello;
    func5(&Test(), "call Test::hello!");

    return 0;
}